package utils

import (
	"github.com/gin-gonic/gin"
	"net/http"
	"reflect"
)

// IsNotEmpty 检查字段是否为空，如果为空则返回错误响应
func IsNotEmpty(c *gin.Context, value interface{}, errorContext string) bool {
	if IsEmpty(c, value, errorContext) {
		return false
	}
	return true
}

// IsEmpty 检查字段是否为空，如果为空则返回错误响应
func IsEmpty(c *gin.Context, value interface{}, errorContext string) bool {
	if value == nil {
		Result(c, false, errorContext, http.StatusInternalServerError, nil)
		return true
	}
	// 获取值的反射类型
	val := reflect.ValueOf(value)
	switch val.Kind() {
	case reflect.String:
		// 字符串为空
		if val.Len() == 0 {
			Result(c, false, errorContext, http.StatusInternalServerError, nil)
			return true
		}
	case reflect.Slice, reflect.Array, reflect.Map, reflect.Chan:
		// 切片、数组、映射、通道为空
		if val.Len() == 0 {
			Result(c, false, errorContext, http.StatusInternalServerError, nil)
			return true
		}
	case reflect.Ptr, reflect.Interface:
		// 指针或接口为空
		if val.IsNil() {
			Result(c, false, errorContext, http.StatusInternalServerError, nil)
			return true
		}
	case reflect.Struct:
		// 结构体需要特殊处理（例如 time.Time）
		if val.Type().String() == "time.Time" {
			// 如果是 time.Time 类型，判断是否为零值
			if val.IsZero() {
				Result(c, false, errorContext, http.StatusInternalServerError, nil)
				return true
			}
		}
	default:
		// 其他类型（如整数、浮点数等），判断是否为零值
		if reflect.DeepEqual(value, reflect.Zero(val.Type()).Interface()) {
			Result(c, false, errorContext, http.StatusInternalServerError, nil)
			return true
		}
	}
	// 如果不为空，返回 true
	return false
}
